package com.ilongsay.service.impl;

import com.ilongsay.dao.BillSqliteDao;
import com.ilongsay.dao.BillSqliteDetailDao;
import com.ilongsay.entity.AjaxObject;
import com.ilongsay.entity.ErrorAdjust;
import com.ilongsay.entity.FaPiao;
import com.ilongsay.entity.FaPiaoDetail;
import com.ilongsay.service.ISettingService;
import com.ilongsay.service.ISixErrorAdjustService;
import com.ilongsay.utils.CalcUtils;
import com.ilongsay.utils.ConfirmUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author ilongsay
 * @Email ilongsay@163.com
 * @Copyright 版本所有，侵权必究！
 * @Datetime 2019-01-30 23:11
 * @Describution
 */
@Service
public class SixErrorAdjustServiceImpl implements ISixErrorAdjustService {

    @Autowired
    private ISettingService settingService;

    @Autowired
    private BillSqliteDao billSqliteDao;

    @Autowired
    private BillSqliteDetailDao billSqliteDetailDao;

    @Autowired
    private AjaxObject ajaxObject;

    private final static String MSG_OK = "误差调整成功，请检查数据是否正确！";
    private final static String MSG_ERROR = "误差调整失败，原因：";

    @Override
    public Object autoSixErrorAdjust(ErrorAdjust adjust, String billCode) {
        settingService.updateErrorAdjustSetting(adjust);
        String[] billCodes = billCode.split(",");
        String amount = adjust.getAmount();
        String amount1 = amount.replace(amount.substring(0, 1), "");//获取去掉前面符号后的数据

        final String NUMBER_ONE = amount.substring(0, 1) + "0.01";

        try {
            Double.valueOf(amount1);//这里其实是判断一下客户输入的数据是否符合相关的要求
        } catch (Exception e) {
            ajaxObject.setCode("1");
            ajaxObject.setMsg(MSG_ERROR+"数据格式错误，请检查输入的数据是否包含空格或其他非数字符号！");
            e.printStackTrace();
            return ajaxObject;
        }
        Integer amount_100 = Double.valueOf(CalcUtils.mul(amount1, "100")).intValue();
        for (String bill : billCodes) {//客户可能会多选，这里先遍历单据
            List<FaPiao> faPiao = billSqliteDao.findBillByBillCode(bill);
            //TODO：以后这里要用设计模式进行优化，代码太繁杂
            FaPiaoDetail faPiaoDetail = null;
            List<FaPiaoDetail> faPiaoDetails = new ArrayList<>();
            Integer divTaxRateAnd1;
            switch (adjust.getAmountType()) {
                case "1"://金额类型是含税金额,还要判断固定金额的值
                    for (int i = 0; i < amount_100; i++) {//客户输入的调整的次数，单位分，这里需要换算为整型
                        faPiaoDetail = faPiao.get(0).getFaPiaoDetails().get(i);
                        divTaxRateAnd1 = Integer.valueOf(CalcUtils.div(amount_100.toString(), CalcUtils.add("1", faPiaoDetail.getTaxRate()), 0));//得到一个整数
                        if (adjust.getFixType().equals("0")) {//固定金额是未税金额，同时调整含税和税额
                            //未税金额 = 含税金额 - 税额 ，含税金额增加1分那么税额便减少1分
                            faPiaoDetail.setTotal(CalcUtils.add(faPiaoDetail.getTotal(), NUMBER_ONE));//增加或者减少0.01分钱
                            faPiaoDetail.setTaxAmount(CalcUtils.add(faPiaoDetail.getTaxAmount(), CalcUtils.mul("-1", NUMBER_ONE)));//税额减少或增加一分，取的是相反数
                        } else if (adjust.getFixType().equals("2")) {//固定金额是税额
                            //税额 = 含税金额 - 未税金额
                            faPiaoDetail.setTotal(CalcUtils.add(faPiaoDetail.getTotal(), NUMBER_ONE));//增加或者减少0.01分钱
                            faPiaoDetail.setUntotal(CalcUtils.add(faPiaoDetail.getUntotal(), CalcUtils.mul("-1", NUMBER_ONE)));//税额减少或增加一分，取的是相反数
                        } else if (adjust.getFixType().equals("0,2") || adjust.equals("2,0")) {//固定金额是未税和税额
                            // 含税金额 = 未税金额 + 税额，所以仅仅只调整含税金额
                            faPiaoDetail.setTotal(CalcUtils.add(faPiaoDetail.getTotal(), NUMBER_ONE));//增加或者减少0.01分钱
                        } else {//都不固定
                            //金额增加或减少这些数据
                            faPiaoDetail.setTotal(CalcUtils.add(faPiaoDetail.getTotal(), NUMBER_ONE));//增加或者减少0.01分钱
                            if (i < divTaxRateAnd1) {//如果i小于增加的数据÷(1+税率)，未税金额增加，否则就是税额增加
                                faPiaoDetail.setUntotal(CalcUtils.add(faPiaoDetail.getUntotal(), NUMBER_ONE));//未税金额增加
                            } else {
                                faPiaoDetail.setTaxAmount(CalcUtils.add(faPiaoDetail.getTaxAmount(), NUMBER_ONE));//税额增加
                            }
                        }
                        faPiaoDetails.add(faPiaoDetail);//将改动的明细信息放入到集合中，节省性能
                    }
                    ConfirmUtils.fixAmount(faPiao.get(0));//对调整后的数据重新校验
                    billSqliteDao.updateAll(faPiao.get(0));//更新主表的数据
                    for (FaPiaoDetail faPiaoDetail1 : faPiaoDetails) {
                        billSqliteDetailDao.updateDetailAll(faPiaoDetail1);
                    }
                    break;
                case "0"://金额类型是未税金额
                    Integer mulTaxRateAndAmount100;
                    for (int i = 0; i < amount_100; i++) {//客户输入的调整的次数，单位分，这里需要换算为整型
                        faPiaoDetail = faPiao.get(0).getFaPiaoDetails().get(i);
                        mulTaxRateAndAmount100 = Integer.valueOf(CalcUtils.sround(CalcUtils.mul(amount_100.toString(),faPiaoDetail.getTaxRate()),0));//得到一个整数,调整数据*税率
                        if (adjust.getFixType().equals("1")) {//固定金额是含税金额，同时调整未税和税额
                            //含税金额 = 未税金额 + 税额 ，含税金额增加1分那么税额便减少1分
                            faPiaoDetail.setUntotal(CalcUtils.add(faPiaoDetail.getUntotal(), NUMBER_ONE));//增加或者减少0.01分钱
                            faPiaoDetail.setTaxAmount(CalcUtils.add(faPiaoDetail.getTaxAmount(), CalcUtils.mul("-1", NUMBER_ONE)));//税额减少或增加一分，取的是相反数
                        } else if (adjust.getFixType().equals("2")) {//固定金额是税额
                            //税额 = 含税金额 - 未税金额
                            faPiaoDetail.setUntotal(CalcUtils.add(faPiaoDetail.getUntotal(), NUMBER_ONE));//增加或者减少0.01分钱
                            faPiaoDetail.setTotal(CalcUtils.add(faPiaoDetail.getTotal(), CalcUtils.mul("-1", NUMBER_ONE)));//税额减少或增加一分，取的是相反数
                        } else if (adjust.getFixType().equals("1,2") || adjust.equals("2,1")) {//固定金额是含税和税额
                            // 含税金额 = 未税金额 + 税额，所以仅仅只调整未税金额
                            faPiaoDetail.setUntotal(CalcUtils.add(faPiaoDetail.getUntotal(), NUMBER_ONE));//增加或者减少0.01分钱
                        } else {//都不固定
                            faPiaoDetail.setUntotal(CalcUtils.add(faPiaoDetail.getUntotal(), NUMBER_ONE));//未税金额增加
                            if (i < mulTaxRateAndAmount100) {//调整金额*税率
                                faPiaoDetail.setTaxAmount(CalcUtils.add(faPiaoDetail.getTaxAmount(), NUMBER_ONE));//税额增加
                            }
                        }
                        faPiaoDetails.add(faPiaoDetail);//将改动的明细信息放入到集合中，节省性能
                    }
                    ConfirmUtils.fixAmount(faPiao.get(0));//对调整后的数据重新校验
                    billSqliteDao.updateAll(faPiao.get(0));//更新主表的数据
                    for (FaPiaoDetail faPiaoDetail1 : faPiaoDetails) {
                        billSqliteDetailDao.updateDetailAll(faPiaoDetail1);
                    }
                    break;
                case "2"://金额类型是税额
                    for (int i = 0; i < amount_100; i++) {//客户输入的调整的次数，单位分，这里需要换算为整型
                        faPiaoDetail = faPiao.get(0).getFaPiaoDetails().get(i);
                        if (adjust.getFixType().equals("1")) {//固定金额是含税金额，同时调整未税和税额
                            //含税金额 = 未税金额 + 税额
                            faPiaoDetail.setTaxAmount(CalcUtils.add(faPiaoDetail.getTaxAmount(), NUMBER_ONE));//税额增加
                            faPiaoDetail.setUntotal(CalcUtils.add(faPiaoDetail.getUntotal(), CalcUtils.mul("-1", NUMBER_ONE)));//未税减少
                        } else if (adjust.getFixType().equals("0")) {//固定金额是未税金额
                            //税额 = 含税金额 - 未税金额，增加税额，减少含税
                            faPiaoDetail.setTaxAmount(CalcUtils.add(faPiaoDetail.getTaxAmount(), NUMBER_ONE));//增加或者减少0.01分钱
                            faPiaoDetail.setTotal(CalcUtils.add(faPiaoDetail.getTotal(), CalcUtils.mul("-1", NUMBER_ONE)));//税额减少或增加一分，取的是相反数
                        } else if (adjust.getFixType().equals("1,0") || adjust.equals("0,1")) {//固定金额是含税和未税
                            // 含税金额 = 未税金额 + 税额，所以仅仅只调整未税金额
                            faPiaoDetail.setTaxAmount(CalcUtils.add(faPiaoDetail.getTaxAmount(), NUMBER_ONE));//增加或者减少0.01分钱
                        } else {//都不固定，那么税额增加1分钱的话，未税金额几乎要增加6分钱，税率在0.16的情况下
                            faPiaoDetail.setTaxAmount(CalcUtils.add(faPiaoDetail.getTaxAmount(), NUMBER_ONE));//税额金额增加
                            faPiaoDetail.setUntotal(CalcUtils.add(faPiaoDetail.getUntotal(),CalcUtils.div(NUMBER_ONE,faPiaoDetail.getTaxRate(),2)));
                        }
                        faPiaoDetails.add(faPiaoDetail);//将改动的明细信息放入到集合中，节省性能
                    }
                    ConfirmUtils.fixAmount(faPiao.get(0));//对调整后的数据重新校验
                    billSqliteDao.updateAll(faPiao.get(0));//更新主表的数据
                    for (FaPiaoDetail faPiaoDetail1 : faPiaoDetails) {
                        billSqliteDetailDao.updateDetailAll(faPiaoDetail1);
                    }
                    break;
            }
        }
        ajaxObject.setMsg(MSG_OK);
        ajaxObject.setCode("0");

        return ajaxObject;
    }

    @Override
    public Object handSixErrorAdjust(ErrorAdjust adjust, String billCode) {
        return null;
    }
}
